#include<stdio.h>
#include<unistd.h>
#include<signal.h>

void printfpending(sigset_t *pending)
{
    //打印pending信号集的内容(前31位)
    for(int i = 1;i<=31;++i)
    {
        if(sigismember(pending,i)) printf("1 ");
        else printf("0 ");
    }
    printf("\n");
}
//捕捉2号信号的函数
void handler(int signo)
{
    printf("handler signo:%d\n",signo);
}
int main()
{
    //捕捉2号信号
    signal(2,handler);
    //1.创建set和oset，注意初始化
    sigset_t set,oldset;
    sigemptyset(&set);
    sigemptyset(&oldset);
    //2.将二号信号放入set中，并且阻塞信号2
    sigaddset(&set,2);
    sigprocmask(SIG_SETMASK,&set,&oldset);
    //3.一个空的set
    sigset_t pending;
    sigemptyset(&pending);
    //4.死循环打印pending
    //在count == 10取消屏蔽
    int count = 0;
    
    while(1)
    {
        //在程序死循环运行时按ctrl+c触发信号2.
        sigpending(&pending);
        printfpending(&pending);
        sleep(1);
        count++;
        if(count == 10)
        {
            sigprocmask(SIG_SETMASK,&oldset,NULL);
            printf("信号屏蔽恢复\n");
        }
    }
    return 0;
}